package main

//闭包练习
import "fmt"

//返回一个函数
func add() func(int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}

//变量f是一个函数并且它引用了其外部作用域中的x变量，此时f就是一个闭包。 在f的生命周期内，变量x也一直有效。 闭包进阶示例1
func main() {
	// var f = add()
	// fmt.Println(f(10))
	// fmt.Println(f(20))
	// fmt.Println(f(30))
	// fmt.Println("---------------")
	// f1 := add()
	// fmt.Println(f1(40))
	// fmt.Println(f1(50))

	var f = add1(10)
	fmt.Println(f(10))
	fmt.Println(f(20))
	fmt.Println(f(30))
	fmt.Println("---------------")
	f1 := add()
	fmt.Println(f1(40))
	fmt.Println(f1(50))
}

//进阶1
func add1(x int) func(int) int {
	return func(i int) int {
		x += i
		return x
	}
}
